<?php
namespace App\Util;

/**
 * Api 接口 操作结果
 * Class Result
 * @package Common\Util
 */
class ApiResult {
    /**
     * 消息
     * @var string
     */
    public $msg = "";

    /**
     * 是否成功
     * @var bool
     */
    public $success = false;

    /**
     * 附加的数据
     * @var mixed
     */
    public $data = [];

    /**
     * 类型
     * @var string
     */
    public $type = "";


    /**
     * 状态码
     * @var string
     */
    public $code = '';

    /**
     * 实例
     * @var self | null
     */
    public static $instance = null;

    /**
     * 避免实例化
     */
    private function __construct() {

    }

    /**
     * 初始化
     * @return Result
     */
    public static function getInstance() {
        self::$instance = new self;
        return self::$instance;
    }

    /**
     * 应用结果
     * @param string $msg 消息
     * @param bool $success 是否成功
     * @param array $data  传过去的自定义数据
     * @param int $code
     * @return Result
     */
    public static function apply($msg = "操作失败", $success = false, $data = [] ,$code = 0) {
        $result = self::getInstance();
        $result->msg = $msg;
        $result->success = $success;
        $result->data = $data;
        $result->code = $code;
        return $result;
    }

    /**
     * 操作成功
     * @param string $msg 消息
     * @param array $data 数据
     * @param int $code 成功状态码 默认200
     * @return Result
     */
    public static function success($msg="操作成功",$data=[],$code = 200){
        return self::apply($msg, true, $data ,$code);
    }

    /**
     * 操作失败
     * @param string $msg 消息
     * @param array $data 数据
     * @param int $code 500错误
     * @return Result
     */
    public static function failure($msg="操作失败",$data=[],$code = 500){
        return self::apply($msg, false, $data ,$code);
    }

    /**
     * 返回结果信息
     * @return array
     */
    public function getResult(){
        return [
            'msg'=>$this->msg,
            'data'=>$this->data,
            'code'=>$this->code
        ];
    }

    /**
     * 获得消息
     * @return string
     */
    public function getMsg() {
        return $this->msg;
    }

    /**
     * 设置消息
     * @param string $msg
     * @return Result
     */
    public function setMsg($msg) {
        $this->msg = $msg;
        return $this;
    }

    /**
     * 获得消息
     * @return string
     */
    public function getCode() {
        return $this->code;
    }

    /**
     * 设置消息
     * @param string $code
     * @return Result
     */
    public function setCode($code) {
        $this->code = $code;
        return $this;
    }


    /**
     * 是否成功
     * @return boolean
     */
    public function isSuccess() {
        return $this->success;
    }

    /**
     * 设置是否成功
     * @param boolean $success
     * @return Result
     */
    public function setSuccess($success) {
        $this->success = $success;
        return $this;
    }

    /**
     * 获取数据
     * @return mixed
     */
    public function getData() {
        return $this->data;
    }

    /**
     * 设置数据
     * @param mixed $data
     * @return Result
     */
    public function setData($data) {
        $this->data = $data;
        return $this;
    }

    /**
     * 获取类型
     * @return string
     */
    public function getType() {
        return $this->type;
    }

    /**
     * 设置类型
     * @param string $type
     * @return Result
     */
    public function setType($type) {
        $this->type = $type;
        return $this;
    }

    /**
     * 渲染为json
     * @return array
     */
    public function renderJson(){
        return json_encode($this->getResult());
    }
}